// 程序入口
const express = require('express')
const session = require('cookie-session')
const multer = require('multer')
const path = require('path')
const fs = require('fs')


// 创建主应用
const app = express()

// 上传配置
const upload = multer({
    dest: './static/upload',//上传文件的存储路径
    limits: {
        fileSize: 1024 * 1024 * 2 //单个文件大小限制在2M之内

    }
})
// 模板引擎的设置
app.set('view engine', 'html')//文件是html
app.set('views', `${__dirname}/views`)//设置模板存放的目录
app.engine('html', require('ejs').renderFile)//对文件名后缀为html的模板文件使用express-art-template模板引擎处理


// 静态资源配置
app.use(express.static('static'))
// post请求处理
app.use(express.urlencoded({ extended: true }))

// SESSION配置
app.use(session({
    keys: ['secret'],
    maxAge: 1000 * 60 * 30

}))
// session延期
app.use((req, res, next) => {
    req.session.nowInMinutes = Math.floor(Date.now() / 60e3)
    next()
})

// 调用首页子应用
// app.use('/', require('./router/index'))
// app.use('/index', require('./router/index'))

// 正则表达式写法
app.use(/\/(index)?/, require('./router/index'))
// 调用文章子应用
app.use('/article', require('./router/article'))
// 调用搜索子应用
app.use('/search', require('./router/search'))
// 调用登录子应用
app.use('/login', require('./router/login'))

// 进入后台的权限验证
app.use('/admin/?*', require('./middleware/auth').allowToAdmin)

// 上传操作
app.post('/admin/*', upload.single('upload'), (req, res, next) => {
    // 上传成功后的文件对象
    let { file } = req
    if (file) {
        // file.originalname 文件的原名称
        let extname = path.extname(file.originalname)
        // file.path ==> 上传后的文件路径
        fs.renameSync(file.path, file.path + extname)
        // file.filename ==> 上传后的文件名
        req.uploadUrl = '/upload/' + file.filename + extname

    }
    next()

})
// 调用后台首页
// 如果我们想通过正则查找/符号，但是 /在正则中有特殊的意义。如果写成///这会造成解析错误，所以要使用转义语法 /\//来匹配
app.use(/\/admin\/(index)?/, require('./router/admin/index'))
// 调用后台文章管理
app.use('/admin/article', require('./router/admin/article'))
// 调用后台类目管理
app.use('/admin/category', require('./router/admin/category'))
// 调用后台日志管理
app.use('/admin/log', require('./router/admin/log'))
// 调用后台账户管理
app.use('/admin/account', require('./router/admin/account'))

// 退出
app.get('/user/logout', (req, res) => {
    req.session.user = null
    res.render('login', { msg: '退出成功' })
})

// 监听端口
app.listen(80, "0.0.0.0")